/**
 * Drop 特质
 *
 * 1.Drop 用于释放对象所持有的资源，例如文件，网络等，或者是堆内存等
 * 2.可以为rust的任意类型实现Drop
 * 3.rust通过编译器的方式，会为对象插入离开特定作用域的代码-- 即调用对象的Drop实现 .*    
 *   这个无疑是相对明智的做法，因为这样可以保证资源被释放。
 * 4.如果有多个对象需要释放，那么rust编译器会自动决定需要释放的顺序（通常是创建对象时间的逆序，但不明确是否绝对)
 * 5.Drop 无法被禁止，也无需禁止，因为它的初衷就是为了自动清理
 * 6.Drop 也不能显示调用,但可以使用std::mem::drop()函数来提前释放资源. 这个函数其实就是主要调用Drop特质
 * 7.所有权系统确保引用总是有效的，也会确保 drop 只会在值不再被使用时被调用一次
 * Drop的示例
 */


#[derive(Debug)]
struct Student {
    name: String,
    age: u32,
}

impl Drop for Student {
    fn drop(&mut self) {
        println!("释放{}({}岁)的资源",self.name,self.age);
    }
}

fn test_drop() {
    let mut mao = Student {
        name: String::from("高温i"),
        age: 20,
    };
    mao.age = 21;
}

fn main() {
    test_drop();
    let lu = Student {
        name: String::from("卢俊义"),
        age: 40,
    };
    println!("{:#?}", lu);
    std::mem::drop(lu);  //手动释放。如果不释放，那么程序退出的时候也会被自动调用一次。 
                         //drop 函数主要作用就是调用Drop特质，所以这里手动释放也行。
    println!("main 结束");
}
